void lock(Mutex* pm);
void unlock(Mutex* pm);
class Lock{
public:
explicit Lock(Mutex* pm): mutexPtr(pm){
lock(mutexPtr);
}
~Lock(){
unlock(mutexPtr);
}
private:
Mutex* mutexPtr;
};
int main(void){
Mutex m;
{
Lock m1(&m);
}
}
하지만, 도중에 Mutex가 복사되는 경우
Lock ml1(&m);
Lock ml2(ml1);
아래와 같이 RAII 클래스의 복사에 대한 프로세스를 제한할 수 있다.
1. 복사를 금지
2. 관리하고 있는 자원에 대한 참조 카운팅
3. 관리하고 있는 자원을 복사함
4. 관리하고 있는 자원의 소유권을 이전
1. 복사를 금지복사 생성자와 복사 대입 연산자(복사 연산 함수)를 private 멤버로 만든다.
class Uncopyable{
protected:
Uncopyable(){}
~Uncopyable(){}
private:
Uncopyable(const Uncopyalbe&);
Uncopyable& operator=(const Uncopyable&);
};
class Lock: private Uncopyable{
public:
};
2. 관리하고 있는 자원에 대한 참조 카운팅shared_ptr도 내부적으로 참조 카운팅을 하고 있다.
shared_ptr은 삭제자(deleter) 지정을 허용한다.
class Lock{
public:
explicit Lock(Mutex* pm): mutexPtr(pm, unlock){
lock(mutexPtr.get());
}
private:
std::shared_ptr<Mutex> mutexPtr;
};
3. 관리하고 있는 자원 복사깊은 복사(deep copy)
4. 관리하고 있는 자원의 소유권을 이전unique_ptr 사용